<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="bTeVb" id="bTeVb"><span data-lake-id="u5dbf883b" id="u5dbf883b">扩展知识</span></h1>
  <p data-lake-id="u3eb86ee7" id="u3eb86ee7"><br></p>
  <p data-lake-id="u1ee62bbf" id="u1ee62bbf"><span data-lake-id="u689b3353" id="u689b3353">在分布式系统中，我们的应用可能是以集群形式对外提供服务的，有可能出现在A服务器登录后，用户下一次访问的时候请求到B服务器，就需要有一个分布式的Sesssion来告诉B服务器用户是登录过的，并且需要拿到用户的登录信息。</span></p>
  <p data-lake-id="udab49d02" id="udab49d02"><span data-lake-id="u2d01512f" id="u2d01512f">​</span><br></p>
  <p data-lake-id="uf1ec36f8" id="uf1ec36f8"><span data-lake-id="u3a35ac58" id="u3a35ac58">在业内，实现分布式Session通常有以下几个方案：</span></p>
  <p data-lake-id="u557cb812" id="u557cb812"><span data-lake-id="uaaf885da" id="uaaf885da">​</span><br></p>
  <p data-lake-id="u8ffab76e" id="u8ffab76e"><strong><span data-lake-id="u4b1017f1" id="u4b1017f1">客户端存储</span></strong><span data-lake-id="u8b5e20b8" id="u8b5e20b8">：用户登录后，将Session信息保存在客户端，用户在每次请求的时候，通过客户端的cookie把session信息带过来。这个方案因为要把session暴露给客户端，</span><strong><span data-lake-id="uc704c2a0" id="uc704c2a0">存在安全风险。</span></strong></p>
  <p data-lake-id="u56b68043" id="u56b68043"><span data-lake-id="u9b7a307d" id="u9b7a307d">​</span><br></p>
  <p data-lake-id="u189dbee8" id="u189dbee8"><strong><span data-lake-id="u981c8c52" id="u981c8c52">基于分布式存储（最常用）</span></strong><span data-lake-id="uc10a7e05" id="uc10a7e05">：将Session数据保存在分布式存储系统中，如分布式文件系统、分布式数据库等。不同服务器可以共享同一个分布式存储，通过Session ID查找对应的Session数据。唯一的缺点就是</span><strong><span data-lake-id="u3355b43e" id="u3355b43e">需要依赖第三方存储</span></strong><span data-lake-id="u812cf5e0" id="u812cf5e0">，如Redis、数据库等。</span></p>
  <p data-lake-id="u84ca3f66" id="u84ca3f66"><span data-lake-id="ubc99da43" id="ubc99da43">​</span><br></p>
  <p data-lake-id="u1653dd3a" id="u1653dd3a"><strong><span data-lake-id="u99daacd9" id="u99daacd9">粘性Session</span></strong><span data-lake-id="u08bf72db" id="u08bf72db">：这个方案指的是把一个用户固定的路由到指定的机器上，这样只需要这台服务器中保存了session即可，不需要做分布式存储。但是这个存在的问题就是</span><strong><span data-lake-id="ue4dc454a" id="ue4dc454a">可能存在单点故障的问题</span></strong><span data-lake-id="ud0f1f3b9" id="ud0f1f3b9">。</span></p>
  <p data-lake-id="ubb9a448a" id="ubb9a448a"><span data-lake-id="uc1e2cdd8" id="uc1e2cdd8">​</span><br></p>
  <p data-lake-id="u79b075ea" id="u79b075ea"><strong><span data-lake-id="u84f50ffc" id="u84f50ffc">Session复制</span></strong><span data-lake-id="u839b278a" id="u839b278a">：当用户的Session在某个服务器上产生之后，通过复制的机制，将他同步到其他的服务器中。这个方案的缺点是有</span><strong><span data-lake-id="u75470c80" id="u75470c80">可能有延迟</span></strong><span data-lake-id="u7be6abd9" id="u7be6abd9">。</span></p>
  <p data-lake-id="u3c8b5b36" id="u3c8b5b36"><span data-lake-id="u9e6f8830" id="u9e6f8830">​</span><br></p>
  <p data-lake-id="ud169ee03" id="ud169ee03"><span data-lake-id="u9f35f215" id="u9f35f215">Tomcat支持Session复制，配置方式可以参考官方文档：</span><a href="https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html" target="_blank" data-lake-id="uf2ca5f00" id="uf2ca5f00"><span data-lake-id="ue64ac010" id="ue64ac010">https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html</span></a></p>
  <p data-lake-id="u72775771" id="u72775771"><span data-lake-id="u57faf73f" id="u57faf73f">​</span><br></p>
  <p data-lake-id="u92dfa94d" id="u92dfa94d"><span data-lake-id="u0c40bdd9" id="u0c40bdd9">Spring中也提供了对Session管理的支持——</span><a href="https://docs.spring.io/spring-session/reference/index.html" target="_blank" data-lake-id="uef68c1e0" id="uef68c1e0"><span data-lake-id="u702c71c9" id="u702c71c9">Spring Session</span></a><span data-lake-id="u7f58f5fc" id="u7f58f5fc">，他集成了很多Session共享的方案，如基于Redis、基于数据库等。</span></p>
  <p data-lake-id="ufc380887" id="ufc380887"><span data-lake-id="uc5673e4b" id="uc5673e4b">​</span><br></p>
  <p data-lake-id="u09b0a1a1" id="u09b0a1a1"><span data-lake-id="u3af61b11" id="u3af61b11">​</span><br></p>
  <p data-lake-id="u111d8891" id="u111d8891"><span data-lake-id="u5bd2454b" id="u5bd2454b"><br><br></span></p>
 </body>
</html>